package ADBook;
/*
 * Description:通讯录管理系统
 * 1. 实现通讯录的增删改查
 * 2. 后台使用MySQL数据库
 * Author: AMark
 * Date:11/13/2023
 * Time:9:34 AM
 */
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.util.Vector;

public class ADB_UI {
    //用户主界面
    private JFrame jFrame;
    //标签，分别是姓名、性别、男、女、电话号码
    private JLabel namel, sexl, pnuml, typel;
    //输入框，获取用户输入的姓名和电话号码
    private JTextField nameinput, phonenuminput, typeinput;
    // 单选按钮，用于选择男或者女
    private JRadioButton maleb, femaleb;

    //用于选择是添加还是删除的按钮
    private JButton addb, delb, updateb, searchb;
    //用于实现单选功能
    private ButtonGroup buttonGroup;
    //用于存放添加按钮和删除按钮
    private JPanel panel1, panel2;

    //用于显示数据库中信息的表格,表格模和表格的区别是表格模型可以动态的改变表格的内容
    private DefaultTableModel ADB_table_Model; //通讯录表格模型
    private JTable ADBTable; //通讯录表格
    //用于显示行列信息
    Vector vcolomn = new Vector();
    Vector vdata = new Vector();
    //数据库连接信息
    String URL = "jdbc:mysql://localhost:3306/hw;?serverTimezone=UTC";
    String USERNAME = "root";
    String PASSWORD = "zhc20040309";
    //创建数据库连接用的
    Connection conn;
    //数据库查询语句
    Statement stmt;
    ResultSet rs;

    //构造函数初始化界面
    public ADB_UI(String title) throws Exception{
        jFrame = new JFrame(title);
        jFrame.setSize(800,500);
        namel = new JLabel("姓名");
        nameinput = new JTextField(15);
        sexl = new JLabel("性别");
        maleb = new JRadioButton("男");
        femaleb = new JRadioButton("女");
        pnuml = new JLabel("电话号码");
        typel = new JLabel("类型");
        typeinput = new JTextField(15);
        phonenuminput = new JTextField(15);
        addb = new JButton("添加");
        delb = new JButton("删除");
        updateb = new JButton("修改");
        searchb = new JButton("查询");
        panel1 = new JPanel();
        panel2 = new JPanel();
        //初始化表格表头
        vcolomn.add("姓名");
        vcolomn.add("性别");
        vcolomn.add("电话号码");
        vcolomn.add("类型");
        ADB_table_Model = new DefaultTableModel(vdata,vcolomn);  //创建表格模型
        ADBTable = new JTable(ADB_table_Model);  //创建表格


        buttonGroup = new ButtonGroup();
        JScrollPane jScrollPane=  new JScrollPane(ADBTable);
        jFrame.add(jScrollPane);
        buttonGroup.add(maleb);
        buttonGroup.add(femaleb);
        panel1.add(maleb);
        panel1.add(femaleb);
        jFrame.add(namel);
        jFrame.add(nameinput);
        jFrame.add(sexl);
        jFrame.add(panel1);
        jFrame.add(pnuml);
        jFrame.add(phonenuminput);
        jFrame.add(typel);
        jFrame.add(typeinput);
        //将表格添加到面板中
        panel2.add(ADBTable);
        jFrame.add(panel2);

        jFrame.add(addb);
        jFrame.add(delb);
        jFrame.add(updateb);
        jFrame.add(searchb);
        jFrame.setVisible(true);
        jFrame.setLayout(new FlowLayout());
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //创建数据库连接
        Class.forName("com.mysql.cj.jdbc.Driver");
        URL = "jdbc:mysql://localhost:3306/hw?serverTimezone=UTC";
        conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
        PreparedStatement pstmt = conn.prepareStatement("select * from ADB");

        rs = pstmt.executeQuery();
        while (rs.next()) {  //逐行读取数据库中的数据，第一次就要读取第二行
            Vector row = new Vector();
            row.add(rs.getString(1));  //姓名
            row.add(rs.getString(2));  //性别
            row.add(rs.getString(3));  //电话号码
            row.add(rs.getString(4));  //类型
            vdata.add(row);
        }
        //按钮监听
        addb.addActionListener(e -> {
            //获取用户输入的姓名和电话号码和类型
            String name = nameinput.getText();
            String phonenum = phonenuminput.getText();
            String type = typeinput.getText();
            String sex = null;
            for (Component c : panel1.getComponents()) {
                if (c instanceof JRadioButton) {
                    if (((JRadioButton) c).isSelected()) {
                        sex = ((JRadioButton) c).getText();
                    }
                }
            }
            //判断用户输入是否为空
            if (name.equals("") || phonenum.equals("") || type.equals("") || sex == null) {
                JOptionPane.showMessageDialog(null, "不能有内容为空");
            } else {
                //添加数据库中的数据
                try {
                    //创建数据库连接
                    conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
                    //创建数据库查询语句
                    stmt = conn.createStatement();
                    //添加数据库中的数据
                    String sql = "insert into adb values('" + name + "','" + sex + "','" + phonenum + "','" + type + "') ";
                    stmt.executeUpdate(sql);
                    //添加表格中的数据
                    Vector row = new Vector();
                    row.add(name);
                    row.add(sex);
                    row.add(phonenum);
                    row.add(type);
                    ADB_table_Model.addRow(row); //ADB_table_Model是表格模型,是显示在前端表格中的数据
                    //清空输入框
                    nameinput.setText("");
                    phonenuminput.setText("");
                    JOptionPane.showMessageDialog(null, "添加成功");
                    //关闭数据库连接
                    stmt.close();
                    conn.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
        //删除按钮的功能，通过用户输入的姓名，电话号以及类型来删除数据库中的数据
        delb.addActionListener(e -> {
            //获取用户输入的姓名和电话号码和类型
            String name = nameinput.getText();
            String phonenum = phonenuminput.getText();
            String type = typeinput.getText();
            //连接数据库找到相关数据并删除
            try {
                //创建数据库连接
                conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
                //创建数据库查询语句
                stmt = conn.createStatement();
                //删除数据库中的数据
                String sql = "delete from adb where name='" + name + "' and phonenum='" + phonenum + "' and type='" + type + "'";
                stmt.executeUpdate(sql);
                //删除表格中的数据
                int row = ADBTable.getSelectedRow();
                ADB_table_Model.removeRow(row);
                //清空输入框
                nameinput.setText("");
                phonenuminput.setText("");
                //弹窗显示查询成功
                JOptionPane.showMessageDialog(null, "查询成功");
                //关闭数据库连接
                stmt.close();
                conn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
        //修改按钮的功能，通过用户输入的姓名来修改剩余内容
        updateb.addActionListener(e -> {
            //获取用户输入的姓名和电话号码和类型
            String name = nameinput.getText();
            String phonenum = phonenuminput.getText();
            String type = typeinput.getText();
            //连接数据库找到相关数据并修改
            try {
                //创建数据库连接
                conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
                //创建数据库查询语句
                stmt = conn.createStatement();
                //修改数据库中的数据
                String sql = "update adb set phonenum='" + phonenum + "' where name='" + name + "'";
                stmt.executeUpdate(sql);
                //修改表格中的数据
                int row = ADBTable.getSelectedRow();
                ADB_table_Model.setValueAt(phonenum, row, 2);
                ADB_table_Model.setValueAt(type, row, 3);
                //清空输入框
                nameinput.setText("");
                phonenuminput.setText("");
                //弹窗显示删除成功
                JOptionPane.showMessageDialog(null, "删除成功");
                //关闭数据库连接
                stmt.close();
                conn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
        //查询，用于查询用户输入的姓名对应的用户信息并显示
        searchb.addActionListener(e -> {
            //获取用户输入的姓名
            String name = nameinput.getText();
            //连接数据库找到相关数据并显示
            try {
                //创建数据库连接
                conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
                //创建数据库查询语句
                stmt = conn.createStatement();
                //查询数据库中的数据
                String sql = "select * from adb where name='" + name + "'";
                rs = stmt.executeQuery(sql);
                //显示表格中的数据
                while (rs.next()) {
                    Vector row = new Vector();
                    row.add(rs.getString(1));
                    row.add(rs.getString(2));
                    row.add(rs.getString(3));
                    row.add(rs.getString(4));
                    ADB_table_Model.addRow(row);
                }
                //清空输入框
                nameinput.setText("");
                phonenuminput.setText("");
                //弹窗显示修改成功
                JOptionPane.showMessageDialog(null, "修改成功");
                //关闭数据库连接
                stmt.close();
                conn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
    }
}
